﻿#ifndef DAUTILNODEFACTORY_H
#define DAUTILNODEFACTORY_H
#include "DAUtilNodePluginGlobal.h"
#include "DAAbstractNodeFactory.h"
#include <functional>

/**
 * @brief 主节点工厂
 *
 * 其他的插件可参看主节点工厂进行编写
 */
class DAUTILNODEPLUGIN_API DAUtilNodeFactory : public DAAbstractNodeFactory
{
public:
    DAUtilNodeFactory(QObject *p = nullptr);

    //工厂名称
    virtual QString factoryName() const;

    //工厂函数，创建一个FCNodeGraphicsItem，工厂不持有FCNodeGraphicsItem的管理权
    virtual DAAbstractNode::SharedPointer create(const DANodeMetaData &meta);

    //获取所有注册的Prototypes
    virtual QStringList getPrototypes() const;

    //获取所有类型的分组，同样的分组会放置在一起，这样一个工厂不仅仅只对应一个分组
    virtual QList<DANodeMetaData> getNodesMetaData() const;

protected:
    void createMetaData();

private:
    DANodeMetaData saveGetMetaType(DAAbstractNode::SharedPointer t);

private:
    using FpCreate = std::function<DAAbstractNode::SharedPointer(void)>;
    QMap<DANodeMetaData, FpCreate> m_prototypeTpfp;
};

#endif // FCNODEGRAPHICSFACTORY_H
